﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autocentro.Entities;
using System.Data;
using System.Data.Objects;

namespace Autocentro.Respository
{
    public class CompraRepository : MasterRepository, ICompraRepository
    {
        public List<COMPRAS> GetFromVentasByCriterio(string criterio)
        {
            var query = from c in context.Compra
                        .Include("PROVEEDOR")
                        .Include("DETALLECOMPRA.PRODUCTO")
                        .Include("DETALLECOMPRA.PRODUCTO.UNIDAD_MEDIDA")
                        select c;
            if (criterio!=null && criterio !=string.Empty && criterio!="")
            {
                query = query.Where(c=>c.Proveedor.RazonSocial.ToUpper()
                    .Contains(criterio.ToUpper()));
                        
            }

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.ToList();
        }

        public COMPRAS GetFromCompraById(int id)
        {
            var query = from c in context.Compra
                        //.Include("PROVEEDOR")
                        .Include("DETALLECOMPRA.PRODUCTO")
                        .Include("DETALLECOMPRA.PRODUCTO.UNIDAD_MEDIDA")
                        where c.Id.Equals(id)
                        select c;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.SingleOrDefault();
        }

        public void AddCompra(COMPRAS compra)
        {
            foreach (var item in compra.DetalleCompra)
            {
                context.Entry(item.Producto).State = EntityState.Unchanged;
                context.Entry(item).State = EntityState.Added;
            }

            context.Entry(compra.Proveedor).State = EntityState.Unchanged;
            context.Compra.Add(compra);
            context.SaveChanges();
        }

        public void UpdateCompra(COMPRAS compra)
        {
            var estadosDetalle = context.ChangeTracker.Entries<DETALLECOMPRA>();

            context.Entry(compra.Proveedor).State = EntityState.Unchanged;
            context.Entry(compra).State = EntityState.Modified;

            foreach (var item in compra.DetalleCompra)
            {
                item.Producto = null;

                context.Entry(item).State = item.Item ==
                    Int32.Parse("0") ? EntityState.Added : EntityState.Modified;

                item.IdProducto = item.IdProducto;
            }

            context.SaveChanges();

        }

        public void RemoveCompra(int id)
        {
            var existe = context.Compra.Find(id);
            if (existe!=null)
            {
                context.Compra.Remove(existe);
                context.SaveChanges();
            }
        }

        public List<COMPRAS> GetallFromCompras()
        {
            var query = from p in context.Compra
                        .Include("PROVEEDOR")
                        .Include("DETALLECOMPRA.PRODUCTO")
                        .Include("DETALLECOMPRA.PRODUCTO.UNIDAD_MEDIDA")
                        select p;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.ToList();
        }


        public List<COMPRAS> GetFromComprasbyFechasAndProveedor(DateTime? fec1, DateTime? fec2, string proveedor)
        {
            #region IF

            if (proveedor != null && proveedor != string.Empty && proveedor!= "")  // FECHAS - proveedor
            {
                var query = from h in context.Compra.Include("PROVEEDOR").Include("DETALLECOMPRA.PRODUCTO.UNIDAD_MEDIDA")
                            select h;

                if (fec1 != null && fec2 != null)//fechas y cliente
                {
                    query = from h in query
                            where (h.Fecha >= fec1.Value && h.Fecha <= fec2.Value) &&
                                    (h.Proveedor.RazonSocial.ToUpper().Contains(proveedor.ToUpper()) ||
                                    h.Proveedor.Ruc.ToUpper().Contains(proveedor.ToUpper()))
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                if (fec1 != null && fec2 == null)//dia y cliente 
                {
                    query = from h in query
                            where
                            (h.Proveedor.RazonSocial.ToUpper().Contains(proveedor.ToUpper()) ||
                            h.Proveedor.Ruc.ToUpper().Contains(proveedor.ToUpper())) && h.Fecha == fec1.Value
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                if (fec1 == null && fec2 == null)//solo cliente
                {
                    query = from h in query
                            where h.Proveedor.RazonSocial.ToUpper().Contains(proveedor.ToUpper()) ||
                            h.Proveedor.Ruc.ToUpper().Contains(proveedor.ToUpper())
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                else //retornar todos
                {
                    query = from h in query
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                return query.Take(500).ToList();
            }

            #endregion

            #region ELSE

            else //sin cliente
            {
                var query = from h in context.Compra.Include("PROVEEDOR").Include("DETALLECOMPRA.PRODUCTO.UNIDAD_MEDIDA")
                            select h;

                if (fec1 != null && fec2 != null)//rango de fechas
                {
                    query = from h in query
                            where h.Fecha >= fec1.Value && h.Fecha <= fec2.Value
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                if (fec1 != null && fec2 == null)//solo dia
                {
                    query = from h in query
                            where
                            h.Fecha == fec1.Value
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                if (fec1 == null && fec2 == null)//solo cliente
                {
                    query = from h in query
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                return query.Take(500).ToList();
            }
            #endregion
        }
    }
}
